#include <iostream>

// 4
class Test
{
public:
    Test()
    {
        a = new int;
    }
    ~Test()
    {
        if (a)
            delete a;
    }
    Test(const Test &t)
    {
        std::cout << "深拷贝\n";
        this->a = new int(*t.a);
    }
    // 移动语义：夺取资源
    Test(Test &&t) // 移动构造函数：通过夺取其他对象资源构建自身
    {
        std::cout << "移动构造\n";
        a = t.a;
        t.a = nullptr; // 再将这块资源置空
    }

private:
    int *a;
};


// 万能引用 T&&：既能接左值，也能接右值的模版 (与右值引用不一样)
void print(int & a)
{
    std::cout<<"左值引用\n";
}
void print(int && a)
{
    std::cout<<"右值引用\n";
}
// 万能引用传入的右值在函数中调用时会被当做左值
// 完美转发(引入forward)：使万能引用传入的参数类型保持不变
template<typename T>
void func(T&& a)
{
    print(std::forward<T>(a));
}

int main()
{
    Test t;
    // func(t);
    func(10);
    return 0;
}